/**
 组合继承（最常用）
 重点：结合了两种模式的优点，传参和复用

 特点：
    1、可以继承父类原型上的属性，可以传参，可复用。
 　 2、每个新实例引入的构造函数属性是私有的，不存在引用属性共享问题。

 缺点：
    调用了两次父类构造函数（耗内存），
    子类的构造函数会代替原型上的那个父类构造函数。
 */

let count = 1
function Parent(name,age){
    this.name = name
    this.age = age
    this.arr = [1,2]
    console.log('调用父类构造函数次数：'+count++)
}
Parent.prototype.prop = 'Person-prop'
Parent.prototype.show = function(){
    console.log(this.name)
}

function Child(phone,...args){
    //call的第一个函数是this指向的对象,即构造函数的实例对象
    Parent.call(this,...args)
    // 或者Parent.apply(this,args)
    this.phone = phone
}

//子级-原型属性：继承父级。改变Child的prototype指针,指向一个Parent的实例
Child.prototype = new Parent()
// Child原型的构造函数修复为Child:
Child.prototype.constructor = Child;
//重写父类的方法，这就是多态,不同的子类继承重写不同的状态
Child.prototype.show=function(){
    console.log('child.show:',this.name)
}

console.log()
console.log('------------new Child-----------------')
var child1 = new Child('137...',"王昭君",20)
console.log('child1.prop:',child1.prop) // Person-prop
child1.show()
console.log()
console.log('-----------new Child------------------')

var child2 = new Child('188...',"安琪拉",22)
console.log('child2.prop:',child2.prop) // Person-prop
child2.show()

console.log()
console.log('-----------------------------')
child2.arr.push(3)
console.log('child2.arr.push(3)',child2.arr) //1,2,3,
console.log('child1.arr',child1.arr) //1,2

console.log()
console.log('-----------------------------')
child1.show=function(){
    console.log('修改child1的show')
}

child1.show()
child2.show()